火星上的并发编程是一门管理多个独立操作(如探测车导航、生命信号遥测和卫星上行链路)的艺术,而无需让系统停顿。在 Go 中,一个 独立运行的任务 被称为 goroutine。
1. 非确定性原则
最好始终假设不同 goroutine 中的操作 可能以任意顺序运行。由于 Go 运行时会在可用核心间调度任务,因此在没有显式同步的情况下,我们无法依赖一个探测车完成扫描后再由另一个开始传输。
go printGopher(c) // 启动一个新的独立任务
2. 同步机制
为了管理这些任务,Go 提供了两种主要工具:
- 互斥锁: goroutine 可以使用一个
mutex来排除彼此在同一时间执行某项操作。 - select 语句: 它看起来像一个 switch 语句,每个分支都包含一个通道接收或发送操作。
select会等待直到某个分支就绪,然后执行该分支。
3. 工作者骨架
长期运行的工作者通常会结合使用一个无限循环和 select 来同时监控多个通信通道:
func worker() {
for {
select {
// 等待通道在这里。
}
}
}
for {
select {
// 等待通道在这里。
}
}
}
TERMINALbash — 80x24
> Ready. Click "Run" to execute.
>